Basic instruction
mov
mov al, [L1]
mov al, L1
mov eax,$+7
movzx eax, ax
movsx eax, ax
cmp
arithmetic
add eax, 4
sub bx, 10
inc ecx
dec dl
add eax, ecx
adc edx, ebx
sub eax, ecx
sbb edx, ebx
mul eax
div ebx
clc
shift
logic shift
arithmetic shift
rotation shift
preproccesor
equal
define
data instruction
db, dw, dd, dq, dt
L1 db 0
L2 dw 1000
L3 dd 11010b
resb, resw, resd, resq, rest
L1 resb 1
L2 times 100 db 0
L3 resw 100
stack
push, pop
subprogram_label:
push ebp
mov ebp, esp
pop ebp
ret
pusha,popa
80x86에서는
PUSHA와 POPA 명령을 이용하여,
EAX, EBX, ECX, EDX, ESI, EDI, EBP 레지스터의 값들을 모두 스택에 push 할 수 있게 한다.
CALL, RET
call subprogram_label
ret
subprogram_label 다음 코드 주소를 push한 후 분기
ret은 분기하기 전에 저장한 다음 코드 주소로 jmp
ENTER,LEAVE
stack fram일을 처리하는 코드
EXTERN, GLOBAL
externd을 통해 외부의 모듈의 global 라벨들을 사용할 수 있다.
global get_int, print_sum
extern get_int, print_sum
LEA
위 코드는 'ebp-8’의 주소를 가지고 eax에 전달하여 준다.
( [ebp-8]이 'ebp-8’의 값을 가르키는 것이 아니다. LEA 명령은 절대로 메모리를 읽어드리지 않는다.
오직 다른 명령이 읽어들일 주소값을 계산하고, 이를 첫 번째 레지스터 피연산자에 저장할 뿐이다.
따라서 별도로 메모리 크기를 지정할 필요가 없다. )
SETxx
setxx 명령은 특별한 경우에서 분기를 이용하지 않을 수 있는 방법을 제공한다.
setxx는 FLAGS의 상태에 따라 바이트 레지스터나 메모리의 값을 0 or 1 로 바꾸어 준다.
SETxx의 조건이 참이라면 그 결과는 1, 거짓이면 0이 저장된다.
CMC
Complement Carry Flag, CF값을 1의 보수로 바꾸어 주는 명령어
CF값이 1이면 0으로, 0이면 1로 바꾸는 코드이다.
CBW CWD CDQ
C는 convert를 B W D Q 는 Byte Word Dword Qword를 의미한다.
CBW같은 경우 Convert Byte to Word로
부호가 있는 비트정보를 확장할 때 사용한다.
CBW - AL의 데이터를 AX로 확장한다.
CWD - AX의 데이터를 DX : AX에 걸쳐 저장한다.
CDQ - EAX의 데이터를 EDX : EAX에 걸쳐 저장한다.
CWD를 DX:AX로 확장할 필요가 없지 CWD는 16비트 때부터 있던 명령어로
그때 사용하던 방법이 x86까지 그대로 이용되는 것이다.